﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CROSLAND.BL.BE;
using System.Data.Common;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Data;


namespace CROSLAND.DL.DALC.MSSQL
{
    public class PedidoDALC : BaseDALC, IPedidoDALC
    {
        String stCon = ConfigurationManager.ConnectionStrings["MSSQLCon"].ToString();
        SqlConnection cn = null;
        SqlCommand cmd = null;
        SqlParameter prm = null;

        public Boolean reenumerar(int pfolio_old, int pfolio_new, string pcaja, string ptipo, string pnroPedido, out string nroPedido)
        {
            nroPedido = "";
            Boolean rpta = true;
            try
            {
                cn = new SqlConnection(stCon);
                if (cn.State == ConnectionState.Closed)
                {
                    cn.Open();
                }

                SqlCommand cmd = new SqlCommand("USPU_REENUMERAR", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                prm = new SqlParameter("P_OLD", SqlDbType.Int);
                prm.Value = pfolio_old;
                prm.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(prm);

                prm = new SqlParameter("P_NEW", SqlDbType.Int);
                prm.Value = pfolio_new;
                prm.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(prm);

                prm = new SqlParameter("P_TIPO", SqlDbType.NVarChar);
                prm.Value = ptipo;
                prm.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(prm);

                prm = new SqlParameter("P_CAJA", SqlDbType.NVarChar);
                prm.Value = pcaja;
                prm.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(prm);

                prm = new SqlParameter("P_NUMERO_PEDIDO", SqlDbType.NVarChar);
                prm.Value = pnroPedido;
                prm.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(prm);

                string res = cmd.ExecuteScalar().ToString();
                if (res.Equals("0"))
                {
                    rpta = false;
                }
                else
                {
                    nroPedido = res;
                }
            }
            catch (Exception ex)
            {
                rpta = false;
            }
            return rpta;
        }
        public string procesarPedido(out string pNumPedido, PedidoBE pObjPedido)
        {
            decimal igv = 0, isc = 0;
            decimal netwr = 0; //para la cabecera.
            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                //TRAEMOS EL IGV DE LA TABLA PARAMETROS
                DbCommand command = dbProvider.GetStoredProcCommand("USPR_LEE_IMPUESTO");
                dbProvider.AddInParameter(command, "CLASE_CONDICION", DbType.String, "YIGV");
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_CLIENTE", DbType.String, pObjPedido.ClienteIGV);
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_MATERIAL", DbType.String, item.Material.materialIGV);
                igv = Convert.ToDecimal(dbProvider.ExecuteScalar(command));
                //asignamos el igv al objeto pedido
                item.Igv.Importe = igv;
                item.Igv.Valor = ((item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) - (item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) / (igv + 1)) * item.Cantidad; //item.SubTotal / (igv + 1);
                netwr += item.SubTotal - item.Igv.Valor;
            }

            string retVal = "", retMsg = "";
            //creamos el datatable Detalle a enviar a sql
            DataTable dtDetalle = new DataTable("Detalle");
            dtDetalle.Columns.Add("POSNR", typeof(string));
            dtDetalle.Columns.Add("MATNR", typeof(string));
            dtDetalle.Columns.Add("CHARG", typeof(string));
            dtDetalle.Columns.Add("ARKTX", typeof(string));
            dtDetalle.Columns.Add("ABGRU", typeof(string));
            dtDetalle.Columns.Add("SPART", typeof(string));
            dtDetalle.Columns.Add("NETWR", typeof(decimal));
            dtDetalle.Columns.Add("WAERK", typeof(string));
            dtDetalle.Columns.Add("KWMENG", typeof(decimal));
            dtDetalle.Columns.Add("VRKME", typeof(string));
            dtDetalle.Columns.Add("WERKS", typeof(string));
            dtDetalle.Columns.Add("LGORT", typeof(string));
            dtDetalle.Columns.Add("WAVMR", typeof(decimal));
            dtDetalle.Columns.Add("KZWI1", typeof(decimal));
            dtDetalle.Columns.Add("KZWI2", typeof(decimal));
            dtDetalle.Columns.Add("KZWI3", typeof(decimal));
            dtDetalle.Columns.Add("KZWI4", typeof(decimal));
            dtDetalle.Columns.Add("KZWI5", typeof(decimal));
            dtDetalle.Columns.Add("KZWI6", typeof(decimal));
            dtDetalle.Columns.Add("MWSBP", typeof(decimal));
            dtDetalle.Columns.Add("COLOR", typeof(string));
            dtDetalle.Columns.Add("ANNIO_FABRICACION", typeof(string));
            dtDetalle.Columns.Add("ANNIO_MODELO", typeof(string));
            //creamos el datatable Detalle a enviar a sql
            DataTable dtCondicion = new DataTable("Condicion");
            //dtCondicion.Columns.Add("VBELN", typeof(decimal));
            dtCondicion.Columns.Add("ITM_NUMBER", typeof(string));
            dtCondicion.Columns.Add("COND_TYPE", typeof(string));
            dtCondicion.Columns.Add("COND_VALUE", typeof(decimal));
            dtCondicion.Columns.Add("COND_VALOR", typeof(decimal));
            DataTable dtInterlocutor = new DataTable("Interlocutor");
            dtInterlocutor.Columns.Add("POSNR", typeof(int));
            dtInterlocutor.Columns.Add("PARVW", typeof(string));
            dtInterlocutor.Columns.Add("STCD1", typeof(string));
            dtInterlocutor.Columns.Add("PERNR", typeof(string));
            dtInterlocutor.Columns.Add("NOMBRE", typeof(string));
            dtInterlocutor.Columns.Add("DIRECCION", typeof(string));
            dtInterlocutor.Columns.Add("COD_POSTAL", typeof(string));
            dtInterlocutor.Columns.Add("NIF", typeof(string));
            dtInterlocutor.Columns.Add("TELEFONO", typeof(string));
            dtInterlocutor.Columns.Add("CIUDAD", typeof(string));
            dtInterlocutor.Columns.Add("REGION", typeof(string));
            dtInterlocutor.Columns.Add("POBLACION", typeof(string));
            DataTable dtTextos = new DataTable("Textos");
            dtTextos.Columns.Add("POSNR", typeof(string));
            dtTextos.Columns.Add("TEXT_ID", typeof(string));
            dtTextos.Columns.Add("TEXT_LINE", typeof(string));
            //Caracteristica
            DataTable dtCaracteristica = new DataTable("Caracteristica");
            dtCaracteristica.Columns.Add("POSNR", typeof(string));
            dtCaracteristica.Columns.Add("CARACTERISTICA", typeof(string));
            dtCaracteristica.Columns.Add("VALOR", typeof(string));

            cn = new SqlConnection(stCon);
            if (cn.State == ConnectionState.Closed)
            {
                cn.Open();
            }

            SqlCommand cmd = new SqlCommand("USPC_CREA_COTIZA", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            prm = new SqlParameter("P_ANGDT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaInicio == null ? DateTime.Now : pObjPedido.FechaInicio;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BNDDT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaFin == null ? DateTime.Now : pObjPedido.FechaFin;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUDAT", SqlDbType.SmallDateTime);
            prm.Value = DateTime.Now;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodTipoDoc;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_LIFSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoEntrega;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FAKSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoFactura;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_NETWR", SqlDbType.Decimal);
            prm.Value = pObjPedido.SubtotalImp;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_WAERK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Moneda;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKORG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrgVentas;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VTWEG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CanalDist;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_SPART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Sector;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKGRP", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodGrupoVend;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKBUR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodOficina;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BSTNK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrdenCompra;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNNR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodCliente;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KVGR1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TAXK1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNWE", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_USR_CREACION", SqlDbType.NVarChar);
            prm.Value = pObjPedido.UsuarioCreacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FECHA_CREACION", SqlDbType.DateTime);
            prm.Value = DateTime.Now;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FKDAT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaFacturacion == Convert.ToDateTime("01/01/0001 12:00:00 a.m.") ? DateTime.Now : pObjPedido.FechaFacturacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_PMNTTRMS", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CondPago;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TURNO", SqlDbType.NVarChar);
            prm.Value = pObjPedido.turno;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_CAJA", SqlDbType.NVarChar);
            prm.Value = pObjPedido.caja;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BOVEDA", SqlDbType.NVarChar);
            prm.Value = pObjPedido.boveda;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_STKZN", SqlDbType.NVarChar);
            prm.Value = pObjPedido.RUCDNI;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            //Descuento Gerencia
            if (pObjPedido.CodTipoDoc == ParametroDALC.getParamValueStatic("CotizacionRep"))
            {
                List<DescuentoBE> lstD = new List<DescuentoBE>();
                lstD = pObjPedido.LstCond;
                DescuentoBE lstF = lstD.Find(X => X.Condicion == "ZD05");
                if (lstF != null)
                {
                    dtCondicion.Rows.Add("000000", "ZD05", lstF.Valor, lstF.Valor);
                }
                else
                {
                    dtCondicion.Rows.Add("000000", "ZD05", 0, 0);
                }
            }
            //-------------------------------------------------------

            string annio_fab = "", annio_mod = "";
            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                TextoBE txtZ07 = item.Textos.Find(x => x.CodTexto == "ZC07");
                TextoBE txtZ09 = item.Textos.Find(x => x.CodTexto == "ZC09");
                if (txtZ07 != null)
                {
                    annio_fab = txtZ07.Descripcion;
                }
                else
                {
                    annio_fab = "";
                }
                if (txtZ09 != null)
                {
                    annio_mod = txtZ09.Descripcion;
                }
                else
                {
                    annio_mod = "";
                }
                dtDetalle.Rows.Add(item.Posicion, item.CodMaterial, item.CodLote, item.DescMaterial, item.MotivoRechazo,
                    pObjPedido.Sector, item.SubTotal - item.Igv.Valor, pObjPedido.Moneda, item.Cantidad, item.CodUMedida, item.CodCentro,
                    item.CodLote, item.PrecioConIGV, item.SubTotal, item.TotalDctos, 0, item.PrecioTotal, 0, 0, item.Igv.Valor,
                    item.color, annio_fab, annio_mod);

                foreach (DescuentoBE itemdcto in item.LstCond)
                {
                    if (itemdcto.Importe != 0m)// && itemdcto.Manual)
                    {
                        dtCondicion.Rows.Add(item.Posicion, itemdcto.Condicion, itemdcto.Importe, itemdcto.Valor);
                    }
                }
                //adicionamos dos descuentos mas para la tabla de condiciones, tanto para respuesto como vehiculos.
                dtCondicion.Rows.Add(item.Posicion, "ZNET", pObjPedido.SubTotal - item.Igv.Valor, pObjPedido.SubTotal - item.Igv.Valor);
                dtCondicion.Rows.Add(item.Posicion, "ZIGV", item.Igv.Importe, item.Igv.Valor);
                //adicionamos solo para vehiculos el ISC
                if (pObjPedido.Sector == "01")
                {
                    //TRAEMOS EL ISC DE LA TABLA PARAMETROS
                    DbCommand command = dbProvider.GetStoredProcCommand("USPR_LEE_IMPUESTO");
                    dbProvider.AddInParameter(command, "CLASE_CONDICION", DbType.String, "YISC");
                    dbProvider.AddInParameter(command, "CLASIF_FISCAL_CLIENTE", DbType.String, pObjPedido.ClienteIGV);
                    dbProvider.AddInParameter(command, "CLASIF_FISCAL_MATERIAL", DbType.String, item.Material.materialISC);
                    isc = Convert.ToDecimal(dbProvider.ExecuteScalar(command));
                    if (isc != 0)
                    {
                        decimal neto1 = (item.SubTotal - item.Igv.Valor);
                        decimal neto2 = (item.SubTotal - item.Igv.Valor) / (1 + isc);
                        dtCondicion.Rows.Add(item.Posicion, "ZISC", isc, neto1 - neto2);
                    }
                    //////asignamos el igv al objeto pedido
                    //////item.Isc.Importe = isc;
                    //////item.Isc.Valor = ((item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) - (item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) / (isc + 1)) * item.Cantidad; //item.SubTotal / (igv + 1);
                    //////netwr += item.SubTotal - item.Igv.Valor;
                }
            }

            string mail = ""; int cont = 10;
            foreach (InterlocutorBE objInter in pObjPedido.Interlocutores)
            {
                if (objInter.Cliente.Mail != null)
                {
                    if (!objInter.Cliente.Mail.Equals(""))
                    {
                        mail = objInter.Cliente.Mail;
                        objInter.Cliente.Mail = string.Empty;
                    }
                }
                //si sector(00) es repuestos entonces se pone un id eventual para identificar los eventuales
                if ((pObjPedido.Sector == "00" && ParametroDALC.esTipoX(objInter.Funcion, "IlocEmpresa") &&
                   (ParametroDALC.getParamValueStatic("TipoApp") == "0") && objInter.Cliente.Descripcion != "") && (objInter.Funcion != "Z1"))
                {
                    objInter.Cliente.Codigo = "1";

                }

                else if (pObjPedido.Sector == "01" && (ParametroDALC.getParamValueStatic("TipoApp") == "0"))
                {
                    if (objInter.Funcion == "WE" || objInter.Funcion == "RE")
                    {
                        objInter.Cliente.Ruc = objInter.Cliente.Codigo;
                    }
                    else
                    {
                        if (objInter.Funcion == "RG" || objInter.Funcion == "AG")
                        {
                            objInter.Cliente.Codigo = objInter.Cliente.Ruc;

                        }

                    }

                }

                string region = "";
                string poblacion = "";
                if (objInter.Funcion == "RG")
                {
                    region = objInter.Region;
                    poblacion = objInter.Poblacion;
                }
                if (ParametroDALC.esTipoX(objInter.Funcion, "IlocEmpresa"))
                {
                    if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                    {
                        if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                        {


                            dtInterlocutor.Rows.Add(cont, objInter.Funcion, objInter.Cliente.Codigo, "",
                                objInter.Cliente.Descripcion, objInter.Cliente.Direccion, objInter.Cliente.CodigoPostal,
                                objInter.Cliente.Ruc, objInter.Cliente.Telefono, objInter.Cliente.Ciudad, region, poblacion);
                        }
                    }
                }
                else if (ParametroDALC.esTipoX(objInter.Funcion, "IlocPersona"))
                {
                    if (!string.IsNullOrEmpty(objInter.Persona.CodPersona))
                    {
                        dtInterlocutor.Rows.Add(cont, objInter.Funcion, "", objInter.Persona.CodPersona,
                                "", "", "", "", "", "", objInter.Cliente.Ciudad);
                    }
                }

                cont = cont + 10;
            }

            foreach (TextoBE objTextoItm in pObjPedido.Textos)
            {
                dtTextos.Rows.Add(objTextoItm.Posicion == null ? "10" : objTextoItm.Posicion, objTextoItm.CodTexto, objTextoItm.Descripcion);
            }

            prm = new SqlParameter("P_TDOCUMENTO_DETALLE", SqlDbType.Structured);
            prm.Value = dtDetalle;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TCONDxDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtCondicion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TINTERLOCUTORXDOCU", SqlDbType.Structured);
            prm.Value = dtInterlocutor;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TEXTOSXDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtTextos;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            pNumPedido = cmd.ExecuteScalar().ToString();
            if (pNumPedido.Trim() != "")
            {
                retVal = "Se creó el doc. de ventas con el número: " + pNumPedido;
            }
            return retVal;
        }

        public PedidoBE leer(string pNumPedido, bool pLight)
        {
            string reembolsable = string.Empty;
            decimal totalDcto = 0;
            decimal totalCab = 0;

            PedidoBE retPedidoBE = new PedidoBE();
            List<InterlocutorBE> lstInterlocutores = new List<InterlocutorBE>();
            List<DetalleBE> lstDetalle = new List<DetalleBE>();
            List<DescuentoBE> lstCondicion = new List<DescuentoBE>();
            List<TextoBE> lstTexto = new List<TextoBE>();

            DbCommand command = dbProvider.GetStoredProcCommand("USPR_LEE_DOCUMENTO");
            dbProvider.AddInParameter(command, "P_VBELN", DbType.String, pNumPedido);
            using (IDataReader dr = dbProvider.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    //reembolsable = dr["Taxk6"].ToString().Trim();
                    retPedidoBE.SubtotalImp = dr["Netwr"] != null ? Convert.ToDecimal(dr["Netwr"]) : 0;
                    retPedidoBE.CodCliente = dr["Kunnr"].ToString();
                    retPedidoBE.OrgVentas = dr["Vkorg"].ToString();
                    retPedidoBE.CanalDist = dr["Vtweg"].ToString();
                    retPedidoBE.Sector = dr["Spart"].ToString();
                    retPedidoBE.CodOficina = dr["Vkbur"].ToString();
                    retPedidoBE.CodGrupoVend = dr["Vkgrp"].ToString();
                    retPedidoBE.CodTipoDoc = dr["Auart"].ToString();
                    //retPedidoBE.CondExp = dr["Vsbed"].ToString();
                    retPedidoBE.Tratado = dr["Ped_Auart"].ToString() != "" ? true : false;
                    //retPedidoBE.TieneEntrega = (dr["Taxk9"].ToString().ToUpper() == "X" ? true : false);
                    //retPedidoBE.Referencia = dr["Xblnr"].ToString();
                    //retPedidoBE.DocOriginal = dr["Vgbel"].ToString();
                    retPedidoBE.OrdenCompra = dr["Bstnk"].ToString();
                    retPedidoBE.BloqueoEntrega = dr["Lifsk"].ToString();
                    retPedidoBE.BloqueoFactura = dr["Faksk"].ToString();
                    //retPedidoBE.Motivo = dr["Augru"].ToString();
                    retPedidoBE.Moneda = dr["Waerk"].ToString();
                    retPedidoBE.Fecha = Convert.ToDateTime(dr["Audat"].ToString());
                    //retPedidoBE.Mail = dr["Crm_Guid"].ToString().Trim();
                    if (dr["Bnddt"].ToString() != "")
                    {
                        retPedidoBE.FechaValidez = Convert.ToDateTime(dr["Bnddt"]);
                    }
                    //if (dr["Vdatu"].ToString() != "00000000")
                    //{
                    //    retPedidoBE.FechaEntrega = Convert.ToDateTime(dr["Vdatu"]);
                    //}

                    retPedidoBE.FechaFacturacion = Convert.ToDateTime(dr["Fkdat"]);
                    //retPedidoBE.GrupoCond = dr["Kdkg1"].ToString();
                    retPedidoBE.CondPago = dr["Pmnttrms"].ToString().Trim();
                }
                DetalleBE objDet = new DetalleBE();

                if (dr.NextResult()) //si existe entonces continuamos con la sgte lista
                {
                    while (dr.Read())
                    {
                        objDet = new DetalleBE();
                        objDet.Posicion = dr["Posnr"].ToString();
                        objDet.CodMaterial = dr["Matnr"].ToString();
                        objDet.CodUMedida = dr["Vrkme"].ToString(); //dr["Meins"].ToString();
                        objDet.CodCentro = dr["Werks"].ToString();
                        objDet.CodAlmacen = dr["Lgort"].ToString();
                        objDet.CodLote = dr["Charg"].ToString();
                        objDet.Posicion = dr["Posnr"].ToString();
                        objDet.DescMaterial = dr["Arktx"].ToString();

                        //if (reembolsable != "")
                        //    objDet.Reembolsable = "(" + reembolsable + ")";

                        //-- tipo de posición
                        //objDet.TipoPosicion = dr["Pstyv"].ToString();
                        //objDet.PosSup = dr["Uepos"].ToString();
                        //objDet.CantComp = Convert.ToDecimal(dr["Kmpmg"]);
                        //objDet.TipoPosAnt = dr["Pstyv"].ToString();
                        //codigo de agrupación
                        //objDet.CodGrupoMat = dr["Mvgr1"].ToString();
                        objDet.MotivoRechazo = dr["Abgru"].ToString();
                        //-- material
                        objDet.Material.CodMaterial = dr["Matnr"].ToString();
                        objDet.Material.CodUMedida = dr["Vrkme"].ToString(); //dr["Meins"].ToString();
                        //objDet.Material.Jerarquia = dr["Prodh"].ToString();

                        //if (ParametroDALC.esTipoX(retPedidoBE.CodTipoDoc, "CodNCND"))
                        //{
                        //    if (Convert.ToInt32(dr["Zmeng"]) == 0)
                        //    {
                        //        objDet.Cantidad = Convert.ToDecimal(dr["Kwmeng"]);
                        //    }
                        //    else
                        //    {
                        //        objDet.Cantidad = Convert.ToDecimal(dr["Zmeng"]);
                        //    }
                        //    objDet.Peso = Convert.ToDecimal(dr["Ntgew"]);
                        //}
                        //else
                        //{
                        objDet.Cantidad = Convert.ToDecimal(dr["Kwmeng"]);//Cantidad
                        //objDet.Peso = Convert.ToDecimal(dr["Ntgew"]);
                        //}
                        objDet.PrecioSinIGV = Convert.ToDecimal(dr["netwr"]);
                        objDet.TotalImpresion = Convert.ToDecimal(dr["Kzwi3"]);
                        objDet.color = dr["color"].ToString();
                        objDet.anniofab = dr["annio_fabricacion"].ToString();
                        objDet.anniomod = dr["annio_modelo"].ToString();
                        lstDetalle.Add(objDet);
                    }
                }

                if (!pLight)
                {
                    //interlocutores
                    if (dr.NextResult()) //si existe entonces continuamos con la sgte lista
                    {
                        while (dr.Read())
                        {
                            InterlocutorBE interl = new InterlocutorBE();
                            interl.Funcion = dr["Parvw"].ToString();
                            interl.Cliente.CodigoPostal = dr["Cod_Postal"].ToString();
                            interl.Cliente.Telefono = dr["Telefono"].ToString();
                            interl.Cliente.Direccion = dr["Direccion"].ToString();
                            if (ParametroDALC.esTipoX(dr["Parvw"].ToString(), "IlocEmpresa"))
                            {
                                interl.Cliente.Codigo = dr["Nif"].ToString();
                                interl.Cliente.Descripcion = dr["Nombre"].ToString();
                                interl.Cliente.Ciudad = dr["Ciudad"].ToString();
                                interl.Cliente.Ruc = dr["Stcd1"].ToString();
                            }
                            else if (ParametroDALC.esTipoX(dr["Parvw"].ToString(), "IlocPersona"))
                            {
                                interl.Persona.CodPersona = dr["Pernr"].ToString();
                                interl.Persona.Descripcion = dr["Nombre"].ToString();
                            }

                            lstInterlocutores.Add(interl);
                        }
                        retPedidoBE.Interlocutores = lstInterlocutores;
                    }
                }
                if (retPedidoBE.LstCond == null)
                {
                    retPedidoBE.LstCond = new List<DescuentoBE>();
                }
                if (dr.NextResult()) //si existe entonces continuamos con la sgte lista
                {
                    while (dr.Read())
                    {
                        DescuentoBE cond = null;
                        //condiciones
                        foreach (DetalleBE item in lstDetalle)
                        {
                            if (dr["itm_number"].ToString() == item.Posicion)
                            {

                                //if (dr["Cond_Type"].ToString() == "ZISC" || dr["Cond_Type"].ToString() == "ZNET" || dr["Cond_Type"].ToString() == "ZIGV")
                                //{
                                //    //item.Precio.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);//item3.Kwert;
                                //    //item.Precio.Importe = Convert.ToDecimal(dr["Cond_Value"]); //item3.Kbetr;
                                //    cond = new DescuentoBE();
                                //    cond.Condicion = dr["Cond_Type"].ToString();
                                //    cond.Importe = 0;// Convert.ToDecimal(dr["Cond_Value"]);
                                //    cond.Valor = 0;//Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                //    retPedidoBE.LstCond.Add(cond); //item.LstCond.Add(cond);
                                //    item.LstCond.Add(cond);

                                //}
                                if (ParametroDALC.esTipoX(dr["Cond_Type"].ToString(), "CondPrecios"))
                                {
                                    item.Precio.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);//item3.Kwert;
                                    item.Precio.Importe = Convert.ToDecimal(dr["Cond_Value"]); //item3.Kbetr;
                                    cond = new DescuentoBE();
                                    cond.Condicion = dr["Cond_Type"].ToString();
                                    cond.Importe = Convert.ToDecimal(dr["Cond_Value"]);
                                    cond.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                    item.LstCond.Add(cond);
                                    break;
                                }
                                else if ((dr["Cond_Type"].ToString().Equals(ParametroDALC.getParamValueStatic("CondIgv"))))
                                {
                                    item.Igv.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                    item.Igv.Importe = Convert.ToDecimal(dr["Cond_Value"]);
                                    break;
                                }
                                else
                                {
                                    //falta revisar asignación dctos y recargos
                                    if (retPedidoBE.CodTipoDoc == "Z013")
                                    {
                                        if (dr["Cond_Type"].ToString() == "YP03")
                                        {
                                            item.Precio.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);//item3.Kwert;
                                            item.Precio.Importe = Convert.ToDecimal(dr["Cond_Value"]); //item3.Kbetr;

                                            cond = new DescuentoBE();
                                            cond.esPorcentaje = false;
                                            cond.Manual = true;
                                            //cond.Posicion = dr["Itm_Number"].ToString();
                                            cond.Condicion = ParametroDALC.getParamValueStatic("CondAnticipo");
                                            cond.Importe = Convert.ToDecimal(dr["Cond_Value"]);
                                            cond.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                            item.LstCond.Add(cond);//retPedidoBE.LstCond.Add(cond); //
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        cond = new DescuentoBE();
                                        cond.Posicion = dr["Itm_Number"].ToString();
                                        cond.Condicion = dr["Cond_Type"].ToString();
                                        cond.Importe = Convert.ToDecimal(dr["Cond_Value"]);
                                        cond.Valor = Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                        item.LstCond.Add(cond);
                                        //retPedidoBE.LstCond.Add(cond);
                                        if (dr["Cond_Type"].ToString() == "ZD01")
                                        {
                                            totalDcto += Convert.ToDecimal(dr["Cond_Valor"] != null ? dr["Cond_Valor"] : 0);
                                        }
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if (retPedidoBE.CodTipoDoc == ParametroDALC.getParamValueStatic("DocRepuestos") && dr["Itm_Number"].ToString() == "000000")
                                {
                                    if (retPedidoBE.LstCond == null || retPedidoBE.LstCond.Count == 0)
                                    {
                                        retPedidoBE.LstCond = new List<DescuentoBE>();
                                        DescuentoBE condN = new DescuentoBE();
                                        condN.Condicion = "ZD05";
                                        condN.Valor = Convert.ToDecimal(dr["Cond_Valor"]);
                                        condN.Importe = Convert.ToDecimal(dr["Cond_Valor"]);
                                        retPedidoBE.LstCond.Add(condN);
                                        break;
                                    }
                                }
                            }
                        }
                        //                        lstDetalle.Add(objDet);
                    }
                }

                if (retPedidoBE.LstCond == null)
                {
                    retPedidoBE.LstCond = new List<DescuentoBE>();
                }

                //para los textos
                if (dr.NextResult()) //si existe entonces continuamos con la sgte lista
                {
                    while (dr.Read())
                    {
                        TextoBE objTxt = new TextoBE();
                        if (dr["Posnr"].ToString() == "")
                        {
                            DetalleBE objItem = lstDetalle.Find(delegate(DetalleBE obj) { return obj.Posicion == dr["Posnr"].ToString(); });
                            objTxt.Posicion = dr["Posnr"].ToString();
                            objTxt.CodTexto = dr["Text_Id"].ToString();
                            objTxt.Descripcion = dr["Text_Line"].ToString();
                            objItem.Textos.Add(objTxt);
                        }
                        else
                        {
                            objTxt.Posicion = dr["Posnr"].ToString();
                            objTxt.CodTexto = dr["Text_Id"].ToString();
                            objTxt.Descripcion = dr["Text_Line"].ToString();
                            lstTexto.Add(objTxt);
                        }
                    }
                }
            }
            retPedidoBE.NumPedido = pNumPedido;
            retPedidoBE.Detalle = lstDetalle;
            retPedidoBE.Textos = lstTexto;
            return retPedidoBE;
        }

        public string modificar(out bool pOk, PedidoBE pObjPedido)
        {
            decimal netwr = 0; //para la cabecera.
            decimal igv = 0;
            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                //TRAEMOS EL IGV DE LA TABLA PARAMETROS
                DbCommand command = dbProvider.GetStoredProcCommand("USPR_LEE_IMPUESTO");
                dbProvider.AddInParameter(command, "CLASE_CONDICION", DbType.String, "YIGV");
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_CLIENTE", DbType.String, pObjPedido.ClienteIGV);
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_MATERIAL", DbType.String, item.Material.materialIGV);
                igv = Convert.ToDecimal(dbProvider.ExecuteScalar(command));
                //asignamos el igv al objeto pedido
                item.Igv.Importe = igv;
                item.Igv.Valor = ((item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) - (item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) / (igv + 1)) * item.Cantidad; //item.SubTotal / (igv + 1);
                netwr += item.SubTotal - item.Igv.Valor;
            }

            //creamos el datatable Detalle a enviar a sql
            DataTable dtDetalle = new DataTable("Detalle");
            dtDetalle.Columns.Add("POSNR", typeof(string));
            dtDetalle.Columns.Add("MATNR", typeof(string));
            dtDetalle.Columns.Add("CHARG", typeof(string));
            dtDetalle.Columns.Add("ARKTX", typeof(string));
            dtDetalle.Columns.Add("ABGRU", typeof(string));
            dtDetalle.Columns.Add("SPART", typeof(string));
            dtDetalle.Columns.Add("NETWR", typeof(decimal));
            dtDetalle.Columns.Add("WAERK", typeof(string));
            dtDetalle.Columns.Add("KWMENG", typeof(decimal));
            dtDetalle.Columns.Add("VRKME", typeof(string));
            dtDetalle.Columns.Add("WERKS", typeof(string));
            dtDetalle.Columns.Add("LGORT", typeof(string));
            dtDetalle.Columns.Add("WAVMR", typeof(decimal));
            dtDetalle.Columns.Add("KZWI1", typeof(decimal));
            dtDetalle.Columns.Add("KZWI2", typeof(decimal));
            dtDetalle.Columns.Add("KZWI3", typeof(decimal));
            dtDetalle.Columns.Add("KZWI4", typeof(decimal));
            dtDetalle.Columns.Add("KZWI5", typeof(decimal));
            dtDetalle.Columns.Add("KZWI6", typeof(decimal));
            dtDetalle.Columns.Add("MWSBP", typeof(decimal));
            dtDetalle.Columns.Add("COLOR", typeof(string));
            dtDetalle.Columns.Add("ANNIO_FABRICACION", typeof(string));
            dtDetalle.Columns.Add("ANNIO_MODELO", typeof(string));
            //creamos el datatable Detalle a enviar a sql
            DataTable dtCondicion = new DataTable("Condicion");
            //dtCondicion.Columns.Add("VBELN", typeof(decimal));
            dtCondicion.Columns.Add("ITM_NUMBER", typeof(string));
            dtCondicion.Columns.Add("COND_TYPE", typeof(string));
            dtCondicion.Columns.Add("COND_VALUE", typeof(decimal));
            dtCondicion.Columns.Add("COND_VALOR", typeof(decimal));
            DataTable dtInterlocutor = new DataTable("Interlocutor");
            dtInterlocutor.Columns.Add("POSNR", typeof(int));
            dtInterlocutor.Columns.Add("PARVW", typeof(string));
            dtInterlocutor.Columns.Add("STCD1", typeof(string));
            dtInterlocutor.Columns.Add("PERNR", typeof(string));
            dtInterlocutor.Columns.Add("NOMBRE", typeof(string));
            dtInterlocutor.Columns.Add("DIRECCION", typeof(string));
            dtInterlocutor.Columns.Add("COD_POSTAL", typeof(string));
            dtInterlocutor.Columns.Add("NIF", typeof(string));
            dtInterlocutor.Columns.Add("TELEFONO", typeof(string));
            dtInterlocutor.Columns.Add("CIUDAD", typeof(string));
            dtInterlocutor.Columns.Add("REGION", typeof(string));
            dtInterlocutor.Columns.Add("POBLACION", typeof(string));
            DataTable dtTextos = new DataTable("Textos");
            dtTextos.Columns.Add("POSNR", typeof(string));
            dtTextos.Columns.Add("TEXT_ID", typeof(string));
            dtTextos.Columns.Add("TEXT_LINE", typeof(string));
            //Caracteristica
            DataTable dtCaracteristica = new DataTable("Caracteristica");
            dtCaracteristica.Columns.Add("POSNR", typeof(string));
            dtCaracteristica.Columns.Add("CARACTERISTICA", typeof(string));
            dtCaracteristica.Columns.Add("VALOR", typeof(string));

            cn = new SqlConnection(stCon);
            if (cn.State == ConnectionState.Closed)
            {
                cn.Open();
            }

            SqlCommand cmd = new SqlCommand("USPU_MODIFICA_COTIZA", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            prm = new SqlParameter("P_VBELN", SqlDbType.NVarChar);
            prm.Value = pObjPedido.NumPedido;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_ANGDT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaInicio == null ? DateTime.Now : pObjPedido.FechaInicio;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUDAT", SqlDbType.SmallDateTime);
            prm.Value = DateTime.Now;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodTipoDoc;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_LIFSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoEntrega;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FAKSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoFactura;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_NETWR", SqlDbType.Decimal);
            prm.Value = pObjPedido.SubtotalImp;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_WAERK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Moneda;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKORG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrgVentas;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VTWEG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CanalDist;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_SPART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Sector;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKGRP", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodGrupoVend;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKBUR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodOficina;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BSTNK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrdenCompra;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNNR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodCliente;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KVGR1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TAXK1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNWE", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FKDAT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaFacturacion == Convert.ToDateTime("01/01/0001 12:00:00 a.m.") ? DateTime.Now : pObjPedido.FechaFacturacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_PMNTTRMS", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CondPago;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TURNO", SqlDbType.NVarChar);
            prm.Value = pObjPedido.turno;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_CAJA", SqlDbType.NVarChar);
            prm.Value = pObjPedido.caja;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BOVEDA", SqlDbType.NVarChar);
            prm.Value = pObjPedido.boveda;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_STKZN", SqlDbType.NVarChar);
            prm.Value = pObjPedido.RUCDNI;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            //Descuento Gerencia
            if (pObjPedido.CodTipoDoc == ParametroDALC.getParamValueStatic("CotizacionRep"))
            {
                List<DescuentoBE> lstD = new List<DescuentoBE>();
                lstD = pObjPedido.LstCond;
                DescuentoBE lstF = lstD.Find(X => X.Condicion == "ZD05");
                if (lstF != null)
                {
                    dtCondicion.Rows.Add("000000", "ZD05", lstF.Valor, lstF.Valor);
                }
                else
                {
                    dtCondicion.Rows.Add("000000", "ZD05", 0, 0);
                }
            }
            //-------------------------------------------------------

            string annio_fab = "", annio_mod = "";
            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                TextoBE txtZ07 = item.Textos.Find(x => x.CodTexto == "ZC07");
                TextoBE txtZ09 = item.Textos.Find(x => x.CodTexto == "ZC09");
                if (txtZ07 != null)
                {
                    annio_fab = txtZ07.Descripcion;
                }
                else
                {
                    annio_fab = "";
                }
                if (txtZ09 != null)
                {
                    annio_mod = txtZ09.Descripcion;
                }
                else
                {
                    annio_mod = "";
                }
                dtDetalle.Rows.Add(item.Posicion, item.CodMaterial, item.CodLote, item.DescMaterial, item.MotivoRechazo,
                    pObjPedido.Sector, item.SubTotal - item.Igv.Valor, pObjPedido.Moneda, item.Cantidad, item.CodUMedida, item.CodCentro,
                    "", item.PrecioConIGV, item.SubTotal, 0, 0, item.Total, 0, item.TotalDctos, item.Igv.Valor,
                    item.color, annio_fab, annio_mod);

                foreach (DescuentoBE itemdcto in item.LstCond)
                {
                    if (itemdcto.Importe != 0m)// && itemdcto.Manual)
                    {
                        dtCondicion.Rows.Add(item.Posicion, itemdcto.Condicion, itemdcto.Importe, itemdcto.Valor);
                    }
                }

                dtCondicion.Rows.Add(item.Posicion, "ZNET", pObjPedido.SubTotal - item.Igv.Valor, pObjPedido.SubTotal - item.Igv.Valor);
                dtCondicion.Rows.Add(item.Posicion, "ZIGV", item.Igv.Importe, item.Igv.Valor);
            }

            string mail = ""; int cont = 10;
            foreach (InterlocutorBE objInter in pObjPedido.Interlocutores)
            {
                if (objInter.Cliente.Mail != null)
                {
                    if (!objInter.Cliente.Mail.Equals(""))
                    {
                        mail = objInter.Cliente.Mail;
                        objInter.Cliente.Mail = string.Empty;
                    }
                }

                string region = "";
                string poblacion = "";
                if (objInter.Funcion == "RG")
                {
                    region = objInter.Region;
                    poblacion = objInter.Poblacion;
                }
                if (ParametroDALC.esTipoX(objInter.Funcion, "IlocEmpresa"))
                {
                    if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                    {
                        if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                        {
                            dtInterlocutor.Rows.Add(cont, objInter.Funcion, objInter.Cliente.tipoNif, "",
                                objInter.Cliente.Descripcion, objInter.Cliente.Direccion, objInter.Cliente.CodigoPostal,
                                objInter.Cliente.Ruc, objInter.Cliente.Telefono, objInter.Cliente.Ciudad, region, poblacion);
                        }
                    }
                }
                else if (ParametroDALC.esTipoX(objInter.Funcion, "IlocPersona"))
                {
                    if (!string.IsNullOrEmpty(objInter.Persona.CodPersona))
                    {
                        dtInterlocutor.Rows.Add(cont, objInter.Funcion, "", objInter.Persona.CodPersona,
                                "", "", "", "", "", "");
                    }
                }

                cont = cont + 10;
            }

            foreach (TextoBE objTextoItm in pObjPedido.Textos)
            {
                dtTextos.Rows.Add(objTextoItm.Posicion == null ? "10" : objTextoItm.Posicion, objTextoItm.CodTexto, objTextoItm.Descripcion);
            }

            prm = new SqlParameter("P_TDOCUMENTO_DETALLE", SqlDbType.Structured);
            prm.Value = dtDetalle;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TCONDxDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtCondicion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TINTERLOCUTORXDOCU", SqlDbType.Structured);
            prm.Value = dtInterlocutor;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TEXTOSXDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtTextos;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            int i = Convert.ToInt16(cmd.ExecuteNonQuery());

            pOk = true;//validar que llegue de la bd sql

            return pObjPedido.NumPedido;
        }

        public string reaprovisionar(out bool pOk, PedidoBE pObjPedido)
        {

            pOk = true;
            return null;
        }

        /// <summary>
        /// función para calcular los precios (Zweb_Calcular_Precio)
        /// </summary>
        /// <param name="pObjPedido">obj con info del doc.</param>
        /// <param name="pItem">obj con el item que se va a tratar</param>
        /// <param name="retval">mensaje de error o vacío si no hay error</param>
        /// <returns>Lista de condiciones</returns>
        public List<DescuentoBE> calcularPrecios(PedidoBE pObjPedido, DetalleBE pItem, out string retval)
        {
            DataTable dtCondicion = new DataTable("Condicion");
            dtCondicion.Columns.Add("ITM_NUMBER", typeof(string));
            dtCondicion.Columns.Add("COND_TYPE", typeof(string));
            dtCondicion.Columns.Add("COND_VALUE", typeof(decimal));
            dtCondicion.Columns.Add("CONDVALUE", typeof(decimal));
            dtCondicion.Columns.Add("CALCTYPCON", typeof(string));
            dtCondicion.Columns.Add("CURRENCY", typeof(string));
            dtCondicion.Columns.Add("COND_COUNT", typeof(string));
            dtCondicion.Columns.Add("COND_ST_NO", typeof(string));
            string p_Ok = "", p_Msg = "";
            DescuentoBE dctoTmp = pItem.LstCond.Find(X => X.Importe != 0); ;// && X.Manual);
            if (dctoTmp != null) //Si se envía algún dcto manual, entonces se envían todas las condiciones a la función
            {
                foreach (DescuentoBE dctoItm in pItem.LstCond)
                {
                    dtCondicion.Rows.Add(pItem.Posicion, dctoItm.Condicion, Math.Abs(dctoItm.Importe));
                }
            }

            cn = new SqlConnection(stCon);
            if (cn.State == ConnectionState.Closed)
            {
                cn.Open();
            }

            SqlCommand cmd = new SqlCommand("USPR_COND_PREC_DCTO", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            prm = new SqlParameter("P_MATNR", SqlDbType.NVarChar);
            prm.Value = pItem.CodMaterial;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNNR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodCliente;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKORG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrgVentas;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VTWEG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CanalDist;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_SPART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Sector;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodTipoDoc;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TIPO", SqlDbType.NVarChar);
            prm.Value = "";
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FECHA", SqlDbType.DateTime);
            prm.Value = pObjPedido.Fecha;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_POSNR", SqlDbType.NVarChar);
            prm.Value = pItem.Posicion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_MSG", SqlDbType.NVarChar);
            prm.Value = p_Msg;
            prm.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_CANTI", SqlDbType.NVarChar);
            prm.Value = pItem.Cantidad;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("T_COND", SqlDbType.Structured);
            prm.Value = dtCondicion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKBUR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodOficina;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KDGRP", SqlDbType.NVarChar);
            prm.Value = "";
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_ZTERM", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CondPago;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_CHARG", SqlDbType.NVarChar);
            prm.Value = pItem.CodLote == null ? "" : pItem.CodLote;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VRKME", SqlDbType.NVarChar);
            prm.Value = "";
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KDKGR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.GrupoCond == null ? "" : pObjPedido.GrupoCond;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_PRODH", SqlDbType.NVarChar);
            prm.Value = "";// pObjMaterialBE.Jerarquia == null ? "" : pObjMaterialBE.Jerarquia;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            InterlocutorBE cRG = pObjPedido.Interlocutores.Find(X => X.Funcion == "RG");

            prm = new SqlParameter("P_ZZCITY3", SqlDbType.NVarChar);
            prm.Value = cRG.Poblacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            List<DescuentoBE> lstDescuentos = new List<DescuentoBE>();
            SqlDataReader drx = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            DataTable dt = new DataTable();
            dt.Load(drx);

            foreach (DataRow item in dt.Rows)
            {
                DescuentoBE obj = new DescuentoBE();
                obj.Condicion = item["COND_TYPE"].ToString();
                obj.Moneda = item["CURRENCY"].ToString();
                obj.Importe = Convert.ToDecimal(item["COND_VALUE"].ToString());
                obj.Valor = Convert.ToDecimal(item["CONDVALUE"].ToString());
                obj.Cond_Count = item["COND_COUNT"].ToString();
                obj.Cond_St_No = item["COND_ST_NO"].ToString();

                DescuentoBE tmp = lstDescuentos.Find(X => X.Condicion == ParametroDALC.getParamValueStatic("CondPrecio1"));
                if (pObjPedido.Moneda.Equals("USD") && tmp == null &&
                    obj.Condicion != ParametroDALC.getParamValueStatic("CondDctoGerenciaMonto") &&
                    obj.Condicion != ParametroDALC.getParamValueStatic("CondPrecio1"))
                {
                    //Convertir de PEN a USD
                    obj.Valor = decimal.Round(obj.Valor / pObjPedido.TipoCambio, 2);
                }

                lstDescuentos.Add(obj);
            }
            retval = (p_Ok == "" ? "" : p_Msg);
            return lstDescuentos;
        }

        public StatusBE verStatus(string pNumPedido)
        {
            throw new NotImplementedException();
        }

        public List<EntregaBE> verEntrega(string pVbeln, string pvbtyp_n)
        {
            throw new NotImplementedException();
        }

        public List<SeguimientoBE> buscaDocumentos(string pNumPedido)
        {
            throw new NotImplementedException();
        }

        public List<CampañaBE> listaCampañas(string pOrgVta, string pCamp, string pCanal, string pTienda, string pPobla,
            DateTime pFecha, string pModelo, string pColor)
        {
            DbCommand command = dbProvider.GetStoredProcCommand("USPR_SELECCIONAR_CAMPANIAS");

            dbProvider.AddInParameter(command, "PI_ORG", DbType.String, pOrgVta);
            dbProvider.AddInParameter(command, "PI_CAMP", DbType.String, pCamp);
            dbProvider.AddInParameter(command, "PI_CANAL", DbType.String, pCanal);
            dbProvider.AddInParameter(command, "PI_TIENDA", DbType.String, pTienda);
            dbProvider.AddInParameter(command, "PI_POBLA", DbType.String, pPobla);
            dbProvider.AddInParameter(command, "PI_FECHA", DbType.Date, pFecha);
            dbProvider.AddInParameter(command, "PI_MODELO", DbType.String, pModelo);
            dbProvider.AddInParameter(command, "PI_COLOR", DbType.String, pColor);

            List<CampañaBE> lstCampaña = new List<CampañaBE>();
            List<ModeloBE> lstModelo = new List<ModeloBE>();
            List<BeneficioBE> lstBeneficio = new List<BeneficioBE>();

            using (IDataReader dr = dbProvider.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    CampañaBE objCampaña = new CampañaBE();
                    objCampaña.campaña = dr["CMPGN"].ToString();
                    objCampaña.campañaTexto = dr["DESCRIPCION"].ToString();
                    objCampaña.orgvta = dr["VKORG"].ToString();
                    objCampaña.oficina = dr["VKBUR"].ToString();
                    objCampaña.canal = dr["VTWEG"].ToString();
                    objCampaña.cityCode = dr["CITY_CODE"].ToString();
                    objCampaña.fechaI = Convert.ToDateTime(dr["FECH_INICIO"].ToString());
                    objCampaña.fechaF = Convert.ToDateTime(dr["FECH_FIN"].ToString());
                    objCampaña.cityCodeTexto = dr["CITY_NAME"].ToString();
                    lstCampaña.Add(objCampaña);
                }
                if (dr.NextResult())
                {
                    while (dr.Read())
                    {
                        BeneficioBE objDetalle = new BeneficioBE();
                        objDetalle.campaña = dr["CAMP"].ToString();
                        objDetalle.material = dr["MATERIAL"].ToString();
                        objDetalle.materialTexto = dr["MATERIALT"].ToString();
                        objDetalle.cantidad = dr["CANT"].ToString();
                        lstBeneficio.Add(objDetalle);
                    }
                }
                if (dr.NextResult())
                {
                    while (dr.Read())
                    {
                        ModeloBE objModelo = new ModeloBE();
                        objModelo.campaña = dr["CAMP"].ToString();
                        objModelo.modelo = dr["MODELO"].ToString();
                        objModelo.modeloTexto = dr["MODELOT"].ToString();
                        objModelo.color = dr["COLOR"].ToString();
                        objModelo.colorTexto = dr["COLORT"].ToString();
                        lstModelo.Add(objModelo);
                    }
                }
            }

            foreach (CampañaBE item in lstCampaña)
            {
                foreach (BeneficioBE itemBen in lstBeneficio)
                {
                    if (itemBen.campaña == item.campaña)
                    {
                        item.ListaBeneficio.Add(itemBen);
                    }
                }
                foreach (ModeloBE itemMod in lstModelo)
                {
                    if (itemMod.campaña == item.campaña)
                    {
                        item.ListaModelo.Add(itemMod);
                    }
                }
            }

            return lstCampaña;
        }

        public List<PedidoBE> ListaPedidoVMS(string nroDoc, string nroLote, DateTime fechaI, DateTime fechaF, string nroPer, string orgVta, string canal, string tienda, string docRef, string nroMat, string nomCli, string nif, string codCli, string txtPos, string tipoDoc)
        {
            throw new NotImplementedException();
        }

        public List<PedidoBE> ListaFacturasVMS(string nroFac, string nroFolio, DateTime fechaI, DateTime fechaF, string codCli, string orgVta, string canal, string centro, string sector, string tienda, string codMat, string nroLote, string nroPer)
        {
            throw new NotImplementedException();
        }

        public List<PedidoBE> ListaFacturasRep(string nroFac, string nroFolio, DateTime fechaI, DateTime fechaF, string codCli, string orgVta, string canal, string centro, string sector, string tienda, string codMat, string nroLote, string nroPer)
        {
            throw new NotImplementedException();
        }

        public List<PedidoBE> ListaPedidoRep(string nroDoc, string nroLote, DateTime fechaI, DateTime fechaF, string nroPer, string orgVta, string canal, string tienda, string docRef, string nroMat, string nomCli, string nif, string codCli, string txtPos)
        {
            throw new NotImplementedException();
        }

        public List<string> RechazarPedido(DateTime fechaInicio, DateTime fechaFin, string orgVtas, string canal, string codCliente, string oficina, List<string> lstLote)
        {
            throw new NotImplementedException();
        }

        public List<string> CrearPedVtaVMS(DateTime fecha, string moneda, string condPago, string orgVtas, string canal,
            string sector, string codCliente, string nroPed, string codDestMer, string codResPago, string motPedido,
            string funcionVE, string oficina, string vendedorSAP, string entFin, string grpVen, string flete, string recTecho,
            string seguro, string dscto, string porcentaje, List<string> lstLote, List<GenericBE> lstStatus,
            string puestoExp, string nroDocReferencia)
        {
            throw new NotImplementedException();
        }

        public string crearPedidoAnticipo(out string pNumPedido, PedidoBE pObjPedido)
        {
            string retVal = "", retMsg = "";
            decimal netwr = 0; //para la cabecera.
            decimal igv = 0;
            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                //TRAEMOS EL IGV DE LA TABLA PARAMETROS
                DbCommand command = dbProvider.GetStoredProcCommand("USPR_LEE_IMPUESTO");
                dbProvider.AddInParameter(command, "CLASE_CONDICION", DbType.String, "YIGV");
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_CLIENTE", DbType.String, pObjPedido.ClienteIGV);
                dbProvider.AddInParameter(command, "CLASIF_FISCAL_MATERIAL", DbType.String, item.Material.materialIGV);
                igv = Convert.ToDecimal(dbProvider.ExecuteScalar(command));
                //asignamos el igv al objeto pedido
                item.Igv.Importe = igv;
                item.Igv.Valor = ((item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) - (item.PrecioUnitario + (item.TotalDctos / item.Cantidad)) / (igv + 1)) * item.Cantidad; //item.SubTotal / (igv + 1);
                netwr += item.SubTotal - item.Igv.Valor;
            }
            //creamos el datatable Detalle a enviar a sql
            DataTable dtDetalle = new DataTable("Detalle");
            dtDetalle.Columns.Add("POSNR", typeof(string));
            dtDetalle.Columns.Add("MATNR", typeof(string));
            dtDetalle.Columns.Add("CHARG", typeof(string));
            dtDetalle.Columns.Add("ARKTX", typeof(string));
            dtDetalle.Columns.Add("ABGRU", typeof(string));
            dtDetalle.Columns.Add("SPART", typeof(string));
            dtDetalle.Columns.Add("NETWR", typeof(decimal));
            dtDetalle.Columns.Add("WAERK", typeof(string));
            dtDetalle.Columns.Add("KWMENG", typeof(decimal));
            dtDetalle.Columns.Add("VRKME", typeof(string));
            dtDetalle.Columns.Add("WERKS", typeof(string));
            dtDetalle.Columns.Add("LGORT", typeof(string));
            dtDetalle.Columns.Add("WAVMR", typeof(decimal));
            dtDetalle.Columns.Add("KZWI1", typeof(decimal));
            dtDetalle.Columns.Add("KZWI2", typeof(decimal));
            dtDetalle.Columns.Add("KZWI3", typeof(decimal));
            dtDetalle.Columns.Add("KZWI4", typeof(decimal));
            dtDetalle.Columns.Add("KZWI5", typeof(decimal));
            dtDetalle.Columns.Add("KZWI6", typeof(decimal));
            dtDetalle.Columns.Add("MWSBP", typeof(decimal));
            dtDetalle.Columns.Add("COLOR", typeof(string));
            dtDetalle.Columns.Add("ANNIO_FABRICACION", typeof(string));
            dtDetalle.Columns.Add("ANNIO_MODELO", typeof(string));
            //creamos el datatable Detalle a enviar a sql
            DataTable dtCondicion = new DataTable("Condicion");
            //dtCondicion.Columns.Add("VBELN", typeof(decimal));
            dtCondicion.Columns.Add("ITM_NUMBER", typeof(string));
            dtCondicion.Columns.Add("COND_TYPE", typeof(string));
            dtCondicion.Columns.Add("COND_VALUE", typeof(decimal));
            dtCondicion.Columns.Add("COND_VALOR", typeof(decimal));
            DataTable dtInterlocutor = new DataTable("Interlocutor");
            dtInterlocutor.Columns.Add("POSNR", typeof(int));
            dtInterlocutor.Columns.Add("PARVW", typeof(string));
            dtInterlocutor.Columns.Add("STCD1", typeof(string));
            dtInterlocutor.Columns.Add("PERNR", typeof(string));
            dtInterlocutor.Columns.Add("NOMBRE", typeof(string));
            dtInterlocutor.Columns.Add("DIRECCION", typeof(string));
            dtInterlocutor.Columns.Add("COD_POSTAL", typeof(string));
            dtInterlocutor.Columns.Add("NIF", typeof(string));
            dtInterlocutor.Columns.Add("TELEFONO", typeof(string));
            dtInterlocutor.Columns.Add("CIUDAD", typeof(string));
            dtInterlocutor.Columns.Add("REGION", typeof(string));
            dtInterlocutor.Columns.Add("POBLACION", typeof(string));
            DataTable dtTextos = new DataTable("Textos");
            dtTextos.Columns.Add("POSNR", typeof(string));
            dtTextos.Columns.Add("TEXT_ID", typeof(string));
            dtTextos.Columns.Add("TEXT_LINE", typeof(string));

            cn = new SqlConnection(stCon);
            if (cn.State == ConnectionState.Closed)
            {
                cn.Open();
            }

            SqlCommand cmd = new SqlCommand("USPC_CREA_COTIZA", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            prm = new SqlParameter("P_ANGDT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaInicio == null ? DateTime.Now : pObjPedido.FechaInicio;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUDAT", SqlDbType.SmallDateTime);
            prm.Value = DateTime.Now;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_AUART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodTipoDoc;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_LIFSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoEntrega;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FAKSK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.BloqueoFactura;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_NETWR", SqlDbType.Decimal);
            prm.Value = pObjPedido.SubtotalImp;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_WAERK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Moneda;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKORG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrgVentas;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VTWEG", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CanalDist;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_SPART", SqlDbType.NVarChar);
            prm.Value = pObjPedido.Sector;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKGRP", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodGrupoVend;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_VKBUR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodOficina;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_BSTNK", SqlDbType.NVarChar);
            prm.Value = pObjPedido.OrdenCompra;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNNR", SqlDbType.NVarChar);
            prm.Value = pObjPedido.CodCliente;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KVGR1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TAXK1", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_KUNWE", SqlDbType.NVarChar);
            prm.Value = ""; //CONSULTAR
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_USR_CREACION", SqlDbType.NVarChar);
            prm.Value = pObjPedido.UsuarioCreacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FECHA_CREACION", SqlDbType.DateTime);
            prm.Value = DateTime.Now;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_FKDAT", SqlDbType.DateTime);
            prm.Value = pObjPedido.FechaFacturacion == Convert.ToDateTime("01/01/0001 12:00:00 a.m.") ? DateTime.Now : pObjPedido.FechaFacturacion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);


            prm = new SqlParameter("P_STKZN", SqlDbType.NVarChar);
            prm.Value = pObjPedido.RUCDNI;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            //prm = new SqlParameter("P_PMNTTRMS", SqlDbType.NVarChar);
            //prm.Value = pObjPedido.CondPago;
            //prm.Direction = ParameterDirection.Input;
            //cmd.Parameters.Add(prm);

            foreach (DetalleBE item in pObjPedido.Detalle)
            {
                dtDetalle.Rows.Add(item.Posicion, item.CodMaterial, item.CodLote, item.DescMaterial, item.MotivoRechazo,
                    pObjPedido.Sector, item.PrecioSinIGV, pObjPedido.Moneda, item.Cantidad, item.CodUMedida, item.CodCentro,
                    "", item.PrecioConIGV, item.SubTotal, 0, 0, item.Total, 0, item.TotalDctos, item.Igv.Valor,
                    "", "", "");

                foreach (DescuentoBE itemdcto in item.LstCond)
                {
                    if (itemdcto.Importe != 0m)
                    {
                        dtCondicion.Rows.Add(item.Posicion, itemdcto.Condicion, itemdcto.Importe, itemdcto.Valor);
                    }
                }
                //adicionamos dos descuentos mas para la tabla de condiciones, tanto para respuesto como vehiculos.
                dtCondicion.Rows.Add(item.Posicion, "ZNET", pObjPedido.SubTotal - item.Igv.Valor, pObjPedido.SubTotal - item.Igv.Valor);
                dtCondicion.Rows.Add(item.Posicion, "ZIGV", item.Igv.Importe, item.Igv.Valor);
            }

            string mail = ""; int cont = 10;
            foreach (InterlocutorBE objInter in pObjPedido.Interlocutores)
            {
                if (objInter.Cliente.Mail != null)
                {
                    if (!objInter.Cliente.Mail.Equals(""))
                    {
                        mail = objInter.Cliente.Mail;
                        objInter.Cliente.Mail = string.Empty;
                    }
                }

                string region = "";
                string poblacion = "";
                if (objInter.Funcion == "RG")
                {
                    region = objInter.Region;
                    poblacion = objInter.Poblacion;
                }
                if (ParametroDALC.esTipoX(objInter.Funcion, "IlocEmpresa"))
                {
                    //si sector(00) es repuestos entonces se pone un id eventual para identificar los eventuales
                    if ((pObjPedido.Sector == "00" && ParametroDALC.esTipoX(objInter.Funcion, "IlocEmpresa") &&
                       (ParametroDALC.getParamValueStatic("TipoApp") == "0") && objInter.Cliente.Descripcion != "") && (objInter.Funcion != "Z1"))
                    {
                        objInter.Cliente.Codigo = "1";

                    }

                    else if (pObjPedido.Sector == "01" && (ParametroDALC.getParamValueStatic("TipoApp") == "0"))
                    {
                        if (objInter.Funcion == "WE" || objInter.Funcion == "RE")
                        {
                            objInter.Cliente.Ruc = objInter.Cliente.Codigo;
                        }
                        else
                        {
                            if (objInter.Funcion == "RG" || objInter.Funcion == "AG")
                            {
                                objInter.Cliente.Codigo = objInter.Cliente.Ruc;
                            }
                        }

                    }
                    if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                    {
                        if (!string.IsNullOrEmpty(objInter.Cliente.Codigo))
                        {
                            dtInterlocutor.Rows.Add(cont, objInter.Funcion, objInter.Cliente.Codigo, "",
                                objInter.Cliente.Descripcion, objInter.Cliente.Direccion, objInter.Cliente.CodigoPostal,
                                objInter.Cliente.Ruc, objInter.Cliente.Telefono, objInter.Cliente.Ciudad, region, poblacion);
                        }
                    }
                }
                else if (ParametroDALC.esTipoX(objInter.Funcion, "IlocPersona"))
                {
                    if (!string.IsNullOrEmpty(objInter.Persona.CodPersona))
                    {
                        dtInterlocutor.Rows.Add(cont, objInter.Funcion, "", objInter.Persona.CodPersona,
                                "", "", "", "", "", "");
                    }
                }

                cont = cont + 10;
            }

            foreach (TextoBE objTextoItm in pObjPedido.Textos)
            {
                dtTextos.Rows.Add(objTextoItm.Posicion == null ? "10" : objTextoItm.Posicion, objTextoItm.CodTexto, objTextoItm.Descripcion);
            }

            prm = new SqlParameter("P_TDOCUMENTO_DETALLE", SqlDbType.Structured);
            prm.Value = dtDetalle;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TCONDxDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtCondicion;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TINTERLOCUTORXDOCU", SqlDbType.Structured);
            prm.Value = dtInterlocutor;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            prm = new SqlParameter("P_TEXTOSXDOCUMENTO", SqlDbType.Structured);
            prm.Value = dtTextos;
            prm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(prm);

            pNumPedido = cmd.ExecuteScalar().ToString();
            if (pNumPedido.Trim() != "")
            {
                retVal = " Se creó el doc. de ventas con el número: " + pNumPedido;
            }
            return retVal;
        }

        public string validaNIFXdoc(int pvbeln, string tipo)
        {
            string ret = "";

            DbCommand command = dbProvider.GetStoredProcCommand("USPR_VALIDANIFXDOC");
            dbProvider.AddInParameter(command, "P_VBELN", DbType.String, pvbeln);
            dbProvider.AddInParameter(command, "P_TIPO", DbType.String, tipo);
            using (IDataReader dr = dbProvider.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    ret = dr["RET"].ToString();
                }
            }
            return ret;
        }
        public string InsertPago(CabPagoBE objPago, List<DetPagosBE> lstPagos, List<DetPedFacBE> lstPedFac,
                            out string tipoMensaje)
        {
            string resultado = string.Empty;
            tipoMensaje = "";
            Database dbProvider = DatabaseFactory.CreateDatabase("MSSQLCon");

            IDbConnection connection = dbProvider.CreateConnection();
            connection.Open();
            DbTransaction transaction = (DbTransaction)connection.BeginTransaction();
            int nroped = 0;
            string tipofac = "";
            foreach (DetPedFacBE item in lstPedFac)
            {
                nroped = int.Parse(item.NroPedido);
                tipofac = item.Tipo;

            }
            if (tipofac != "12")
            {
                resultado = validaNIFXdoc(nroped, tipofac);
            }
            try
            {
                if (resultado != "")
                {
                    tipoMensaje = "E";
                }
                else
                {
                    DbCommand command = dbProvider.GetStoredProcCommand("USPC_CREA_CABPAGO");

                    dbProvider.AddInParameter(command, "CAJA", DbType.String, objPago.Caja);
                    dbProvider.AddInParameter(command, "FECHA", DbType.DateTime, objPago.Fecha);
                    dbProvider.AddInParameter(command, "TURNO", DbType.String, objPago.Turno);
                    dbProvider.AddInParameter(command, "CAJERO", DbType.String, objPago.Cajero);
                    dbProvider.AddInParameter(command, "MONTO_T", DbType.Decimal, objPago.Monto_T);
                    dbProvider.AddInParameter(command, "VUELTO", DbType.Decimal, objPago.Vuelto);
                    dbProvider.AddInParameter(command, "WAERS_VUELTO", DbType.String, objPago.Waers_Vuelto);
                    dbProvider.AddInParameter(command, "CANT_FACT", DbType.Decimal, objPago.Cant_Fact);
                    dbProvider.AddInParameter(command, "BOVEDA", DbType.String, objPago.Boveda);

                    string correlativo = dbProvider.ExecuteScalar(command).ToString();

                    foreach (DetPedFacBE item in lstPedFac)
                    {
                        command.Parameters.Clear();
                        command = dbProvider.GetStoredProcCommand("USPC_CREA_FACTURA");

                        dbProvider.AddInParameter(command, "CORRELATIVO", DbType.String, correlativo);
                        dbProvider.AddInParameter(command, "CAJA", DbType.String, item.Caja);
                        dbProvider.AddInParameter(command, "FECHA", DbType.DateTime, item.Fecha);
                        dbProvider.AddInParameter(command, "TURNO", DbType.String, item.Turno);
                        dbProvider.AddInParameter(command, "CAJERO", DbType.String, item.Cajero);
                        dbProvider.AddInParameter(command, "NRO_PEDIDO", DbType.Decimal, item.NroPedido);
                        dbProvider.AddInParameter(command, "MONTO", DbType.Decimal, item.Monto);
                        dbProvider.AddInParameter(command, "TIPO", DbType.String, item.Tipo);
                        dbProvider.AddInParameter(command, "FOLIO", DbType.String, item.Folio);

                        dbProvider.ExecuteNonQuery(command);
                    }

                    foreach (DetPagosBE item in lstPagos)
                    {
                        command.Parameters.Clear();
                        command = dbProvider.GetStoredProcCommand("USPC_CREA_DETPAGO");

                        dbProvider.AddInParameter(command, "CORRELATIVO", DbType.String, correlativo);
                        dbProvider.AddInParameter(command, "CAJA", DbType.String, item.Caja);
                        dbProvider.AddInParameter(command, "FECHA", DbType.DateTime, item.Fecha);
                        dbProvider.AddInParameter(command, "TURNO", DbType.String, item.Turno);
                        dbProvider.AddInParameter(command, "CAJERO", DbType.String, item.Cajero);
                        dbProvider.AddInParameter(command, "NRO_PEDIDO", DbType.Decimal, item.Nro_Pedido);
                        dbProvider.AddInParameter(command, "TIPO", DbType.String, item.Tipo);
                        dbProvider.AddInParameter(command, "MONEDA", DbType.String, item.Moneda);
                        dbProvider.AddInParameter(command, "MONTO", DbType.Decimal, item.Monto);
                        dbProvider.AddInParameter(command, "OPERADOR", DbType.String, item.Operador);
                        dbProvider.AddInParameter(command, "OPERACION", DbType.String, item.Operacion);

                        dbProvider.ExecuteNonQuery(command);
                    }

                    command.Parameters.Clear();
                    command = dbProvider.GetStoredProcCommand("USPU_DOCUMENTO_TRATADO");

                    dbProvider.AddInParameter(command, "P_VBELN", DbType.String, objPago.nro_cotizacion);

                    dbProvider.ExecuteNonQuery(command);

                    transaction.Commit();

                    resultado = correlativo;
                }
            }

            catch (Exception)
            {
                transaction.Rollback();
                resultado = string.Empty;
            }
            finally
            {
                if (connection.State == ConnectionState.Open) connection.Close();
            }

            return resultado;
        }

        public List<ValidacionStock> validacionStock(string pNumPedido)
        {
            List<ValidacionStock> lstVStock = new List<ValidacionStock>();
            ValidacionStock objVStock = null;
            DbCommand command = dbProvider.GetStoredProcCommand("USPR_VALIDA_STOCK");
            dbProvider.AddInParameter(command, "P_VBELN", DbType.String, pNumPedido);
            using (IDataReader dr = dbProvider.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    objVStock = new ValidacionStock();
                    objVStock.posicion = dr["VALOR1"].ToString();
                    objVStock.codigoMaterial = dr["VALOR2"].ToString();
                    objVStock.descripcionMaterial = dr["VALOR3"].ToString();
                    objVStock.estado = dr["VALOR4"].ToString();
                    objVStock.cantidadConfirmada = Convert.ToDecimal(dr["NUMERO1"]);
                    objVStock.cantidadPedido = Convert.ToDecimal(dr["NUMERO2"]);
                    lstVStock.Add(objVStock);
                }
            }

            return lstVStock;
        }
    }
}
